package bc.sistema.usuario;

import bc.exceptions.RespostaInvalidaException;
import bc.exceptions.SenhaInvalidaException;
import bc.sistema.usuario.seguranca.PerguntaSecreta;

/**
 * Interface Usuario
 *
 * @author Felipe Miranda Medeiros
 * @version 1.0
 */
public interface Usuario {

    public String getNome();
    
    /**
     * Altera a senha caso as senhas passadas sejam válidas e a senha atual
     * corresponda com a que o usuário forneceu.
     *
     * @param senhaAtual Senha atual do usuário.
     * @param novaSenha Nova senha atual do usuário.
     * @throws SenhaInvalidaException Se alguns dos parametros passado forem
     * vazios ou nulos, ou se a senha atual não corresponder a passada.
     */
    public void redefinirSenha(String novaSenha, String senhaAtual) throws SenhaInvalidaException;

    /**
     * Altera a senha caso a resposta da pergunta de segurança seja igual a que
     * o usuário passou.
     *
     * @param novaSenha Nova senha que compreende os requisitos mínimos de
     * segurança.
     * @param perguntaSecreta PerguntaSecreta pertecente ao usuário.
     * @param resposta Resposta passada pelo usuário.
     * @throws SenhaInvalidaException Se a nova senha passada for vazia ou nula
     * e ter os requisitos mínimos de segurança.
     * @throws RespostaInvalidaException Se a resposta não compreender a
     * exigencia de pelo menos 5 caracteres ou não for igual a resposta
     * fornecida pelo usuário.
     * @throws NullPointerException Se a pergunta secreta for null.
     */
    public void redefinirSenha(String novaSenha, PerguntaSecreta perguntaSecreta, String resposta)
            throws RespostaInvalidaException, SenhaInvalidaException;

    /**
     * Define uma nova pergunta e resposta.
     *
     * @param id Um id da pergunta válido (0-6).
     * @param resposta Uma resposta com 5 ou mais caracteres.
     * @throws IndexOutOfBoundsException Se o id passado não estiver entre 0-6.
     * @throws RespostaInvalidaException Se a resposta não compreender a
     * exigencia de pelo menos 5 caracteres.
     */
    public void novaPergunta(int id, String resposta) throws IndexOutOfBoundsException, RespostaInvalidaException;

    /**
     * Verifica se dado uma resposta ela é igual à passada pelo usuário.
     *
     * @param resposta Resposta a ser validada.
     * @return True se a reposta passada conferir com a dada pelo usuário no ato
     * do cadastramento, caso contrário retornará False.
     */
    public boolean validarResposta(String resposta);

    /**
     * Verifica se o username e a senha são iguais as criadas pelo usuário.
     *
     * @param username Username a ser validado.
     * @param senha Senha a ser validada.
     * @return True se a senha e o username passados como parametros forem
     * iguais ao que foi criado no momento do cadastro, e False se apenas um
     * deles não forem validados.
     */
    public boolean validarLogin(String username, String senha);
}
